#include <iostream>
#include <string>
#include <vector>
#include <functional>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>


void PrintPending(const sigset_t& pending)
{
    std::cout << "curr pending list [" << getpid() << "]: "; 
    for(int signo = 31;signo > 0;signo--)
    {
        if(sigismember(&pending,signo))
        {
            std::cout << 1;
        }
        else
        {
            std::cout << 0;
        }
    }
    std::cout << std::endl;
}

void non_handler(int signo)
{
    std::cout << "处理: " << signo << "信号" << std::endl;
}

int main()
{
    ::signal(2,non_handler);
    //1.对2号信号进行屏蔽
    //栈上开辟的空间(可能内部是乱码)
    sigset_t block,oblock;
    sigemptyset(&block);
    sigemptyset(&oblock);
    //1.1添加2号信号
    //现在我们还没把2号信号的屏蔽设置进入内核
    //只是在用户栈上设置了block的位图结构
    //还没有设置进入内核中!
    sigaddset(&block,2);

    //1.2设置进入内核中
    sigprocmask(SIG_SETMASK,&block,&oblock);

    int cnt = 0;
    while(true)
    {
        //2.如何获取pending表?
        sigset_t pending;
        sigpending(&pending);

        //2.1打印
        PrintPending(pending);
        sleep(1);
        cnt++;
        if(cnt == 10)
        {
            std::cout << "解除对2号信号的屏蔽" << std::endl;
            sigprocmask(SIG_SETMASK,&oblock,nullptr);
        }
    }


    return 0;
}
